#include "screenshot.h"

#include <QTimer>
#include <QDir>
#include <QFileDialog>
#include <QApplication>

#ifdef VERSION_5_2
#include <QScreen>
#endif

#include <QDesktopWidget>
//#include <QPixmap>
#include <QtDebug>

ScreenShot::ScreenShot()
{
    screenshotLabel = new QLabel;
    screenshotLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    screenshotLabel->setAlignment(Qt::AlignCenter);
    screenshotLabel->setMinimumSize(240, 160);

    createOptionsGroupBox();
    createButtonsLayout();

    mainLayout = new QVBoxLayout;
    mainLayout->addWidget(screenshotLabel);
    mainLayout->addWidget(optionsGroupBox);
    mainLayout->addLayout(buttonsLayout);
    setLayout(mainLayout);

    shootScreen();
    delaySpinBox->setValue(5);

    setWindowTitle("Screenshot");
    resize(800, 600);
}


void ScreenShot::resizeEvent(QResizeEvent */*event*/)
{
    QSize scaledSize = originalPixmap.size();
    scaledSize.scale(screenshotLabel->size(), Qt::KeepAspectRatio);

    if (!screenshotLabel->pixmap()||scaledSize != screenshotLabel->pixmap()->size())
        updateScreenshotLabel();
}

QPushButton* ScreenShot::createButton(const QString &text, QWidget *receiver, const char *member)
{
    QPushButton *button = new QPushButton(text);
    button->connect(button,SIGNAL(clicked()),receiver,member);
    return button;

}

void ScreenShot::createButtonsLayout()
{
    /*
    newScreenshotButton = new QPushButton("New ScreenShot");
    saveScreenshotButton = new QPushButton("Save ScreenShot");
    quitScreenshotButton = new QPushButton("Quit");

    buttonsLayout = new QHBoxLayout;
    buttonsLayout->addWidget(newScreenshotButton);
    buttonsLayout->addWidget(saveScreenshotButton);
    buttonsLayout->addWidget(quitScreenshotButton);*/

    newScreenshotButton = createButton(tr("New ScreenShot"), this, SLOT(newScreenshot()));
    saveScreenshotButton = createButton(tr("Save ScreenShot"), this, SLOT(saveScreenshot()));
    quitScreenshotButton = createButton(tr("Quit"), this, SLOT(close()));

    buttonsLayout = new QHBoxLayout;
    buttonsLayout->addStretch();
    buttonsLayout->addWidget(newScreenshotButton);
    buttonsLayout->addWidget(saveScreenshotButton);
    buttonsLayout->addWidget(quitScreenshotButton);
}

void ScreenShot::createOptionsGroupBox()
{
    optionsGroupBox = new QGroupBox(tr("Options"));

    delaySpinBox = new QSpinBox;
    delaySpinBox->setSuffix(tr(" s"));
    delaySpinBox->setMaximum(60);
    connect(delaySpinBox, SIGNAL(valueChanged(int)), this, SLOT(updateCheckBox()));

    delaySpinBoxLabel = new QLabel(tr("ScreenShot delay:"));

    hideThisWindowCheckBox = new QCheckBox(tr("Hide This Window"));

    optionsGroupBoxLayout = new QGridLayout;
    optionsGroupBoxLayout->addWidget(delaySpinBoxLabel, 0,0);
    optionsGroupBoxLayout->addWidget(delaySpinBox, 0,1);
    optionsGroupBoxLayout->addWidget(hideThisWindowCheckBox, 1,0,1,1);

    optionsGroupBox->setLayout(optionsGroupBoxLayout);
}

void ScreenShot::updateScreenshotLabel()
{
    screenshotLabel->setPixmap(originalPixmap.scaled(screenshotLabel->size(),
                                                     Qt::KeepAspectRatio,
                                                     Qt::SmoothTransformation));
}

void ScreenShot::newScreenshot()
{
    if (hideThisWindowCheckBox->isChecked())
        hide();
    newScreenshotButton->setDisabled(true);

    QTimer::singleShot(delaySpinBox->value()*1000, this, SLOT(shootScreen())); //shootScreen
    //QTimer::singleShot(delaySpinBox->value()*1000, this, SLOT(shootScreen())); //定时调用shootScreen


    qDebug("new screenshot");
}

void ScreenShot::saveScreenshot()
{
    QString format = "png";
    QString initialPath = QDir::currentPath() + tr("/untitled.") + format;

    QString fileName = QFileDialog::getSaveFileName(this, tr("Save as"), initialPath,
                                                    tr("%1 Files (*.%2);;All Files(*)")
                                                    .arg(format.toUpper())
                                                    .arg(format));
    if (!fileName.isEmpty())
        originalPixmap.save(fileName, format.toLatin1().constData());

    qDebug("save screenshot");
}

void ScreenShot::shootScreen()
{
    if (delaySpinBox->value() != 0)
        qApp->beep();


#ifdef VERSION_5_2
    QScreen *screen = QGuiApplication::primaryScreen();


    if (screen)
        originalPixmap = screen->grabWindow(0);
    updateScreenshotLabel();
#endif
    /* grab while desktop */
    //originalPixmap = QPixmap::grabWindow(QApplication::desktop()->winId());

    originalPixmap = QPixmap::grabWidget(QApplication::activeWindow(), 0,0,800,600);

    newScreenshotButton->setDisabled(false);
    if (hideThisWindowCheckBox->isChecked())
        show();
}

void ScreenShot::updateCheckBox()
{
    if (delaySpinBox->value() == 0)
    {
        hideThisWindowCheckBox->setDisabled(true);
        hideThisWindowCheckBox->setChecked(false);
    }
    else
        hideThisWindowCheckBox->setDisabled(false);
}
